package com.lab.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.lab.common.BusinessException;
import com.lab.common.PageResult;
import com.lab.common.PasswordConstant;
import com.lab.dto.MemberDTO;
import com.lab.dto.MemberPageQueryDTO;
import com.lab.entity.Member;
import com.lab.mapper.MemberMapper;
import com.lab.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Slf4j
public class MemberServicelmpl implements MemberService {

    @Autowired
    private MemberMapper memberMapper;


    /**
     * 新增用户
     * @param memberDTO
     */

    @Override
    public void save(MemberDTO memberDTO) {

        log.info("DTO中的isOnLeave值：{}", memberDTO.getIsOnLeave());
        //此处DTO转成实体类
        Member member = new Member();
        //表示从前面拷贝到后面
        BeanUtils.copyProperties(memberDTO, member);

        log.info("复制后member的isOnLeave值：{}", member.getIsOnLeave());
        //设置帐号状态，1 正常，0 锁定
        //employee.setStatus(StatusConstant.ENABLE);

        //设置密码   MD5加密         employee.getPassword()是得到用户输入的密码  PasswordConstant.DEFAULT_PASSWORD是设置好的已知密码
        member.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

        //设置当前记录的创建时间和修改时间
        member.setCreateTime(LocalDateTime.now());
        member.setUpdateTime(LocalDateTime.now());


        memberMapper.insert(member);
    }


    /**
     * 分页查询
     * @param memberPageQueryDTO
     * @return
     */
    @Override
    public PageResult PageQuery(MemberPageQueryDTO memberPageQueryDTO) {
//MYSQL的写法::select * from employee limit 0,10
        //插件分页查询
        PageHelper.startPage(memberPageQueryDTO.getPageNum(),memberPageQueryDTO.getPageSize());
        //                        页数                             每页展示多少条
//        优点是会自动计算和拦截

        //遵循PageHelper的原则，下面返回一个固定制
        Page<Member> page=memberMapper.pageQuery(memberPageQueryDTO);
//        下面需要返回ResultPage类型的，但上一步将SQL语句处理好后是Page类型的，所以转换一下
        long total = page.getTotal();
        List<Member> records = page.getResult();
        // 当前页码（从Page对象拿，或用memberPageQueryDTO.getPageNum()）
        Integer pageNum = page.getPageNum();
        // 每页条数（从Page对象拿，或用memberPageQueryDTO.getPageSize()）
        Integer pageSize = page.getPageSize();
        return new PageResult(total, records, pageNum, pageSize);
    }


    /**
     * 根据name查询
     * @param name
     * @return
     */
    @Override
    public Member getByNamez(String name) {
        Member member=memberMapper.getByNamez(name);
        //不对前端显示密码
        member.setPassword("****");
        return member;
    }


    /**
     * 修改成员信息
     * @param memberDTO
     */
    @Override
    public void update(MemberDTO memberDTO) {
        //之前已有update，可用，但类型是employee，现在要将employeeDTO转成employee
        Member member = new Member();
        BeanUtils.copyProperties(memberDTO, member);
        member.setUpdateTime(LocalDateTime.now());



        memberMapper.update(member);
    }


    /**
     * 删除员工信息
     * @param id
     */
    @Override
    public void deleteById(Long id) {

        // 1. 校验成员是否存在，复用自定义异常的 resourceNotFound 方法
//        Member member = memberMapper.selectById(id);
//        if (member == null) {
//            log.warn("删除成员失败：ID为{}的成员不存在", id);
//            throw BusinessException.resourceNotFound();
//        }

        // 2. 执行删除操作
        int rows = memberMapper.deleteById(id);
        if (rows != 1) {
            log.error("删除成员异常：ID为{}的成员，实际影响行数{}（预期1行）", id, rows);
            // 新增自定义业务异常场景：删除执行失败（非资源不存在，单独定义错误码和消息）
            throw new BusinessException(500, "成员删除失败，请重试");
        }

        log.info("删除成员成功：ID为{}的成员已删除", id);
    }

    // 若存在其他方法（如 list 查询），可正常保留
//    @Override
//    public List<Member> list() {
//        List<Member> memberList = memberMapper.list();
//        log.info("查询成员列表成功，共{}条数据", memberList.size());
//        return memberList;
//    }

    @Override
    public List<Member> getByName(String name) {
        log.info("根据成员名称查询成员信息：{}", name);
        if (name == null || name.trim().isEmpty()) {
            throw new RuntimeException("成员名称不能为空");
        }

        return memberMapper.getByName(name);
    }

    @Override
    public Member getByStudentId(String studentId) {
        log.info("根据学号查询成员信息：{}", studentId);
        if (studentId == null || studentId.trim().isEmpty()) {
            throw new RuntimeException("学号不能为空");
        }

        return memberMapper.getByStudentId(studentId);
    }

    /**
     * 根据姓名查询成员信息（单条）
     */
    @Override
    public Member getByNameSingle(String name) {
        log.info("根据姓名查询成员信息：{}", name);
        if (name == null || name.trim().isEmpty()) {
            throw new RuntimeException("姓名不能为空");
        }

        return memberMapper.getByNameSingle(name);
    }
}
